package entity;

import entity.Page;

import java.util.List;

//指令类
public class Instruction {
    public int jobNo;               //指令序号
    public int pageNo;              //页号
    public int unitNo;              //单元号
    public boolean isInter=false;   //所需页是否在主存
    public int xiugai;              //页面是否被修改 0表示不修改 1表示修改


    public Instruction(int jobNo, int pageNo, int unitNo, int xiugai) { //构造函数
        this.jobNo=jobNo;
        this.pageNo=pageNo;
        this.unitNo=unitNo;
        this.xiugai=xiugai;
    }
    public boolean getIsInter() {
        return isInter;
    }
    @Override
    //改写父类方法,输出指令信息
    public String toString() {
        return "指令"+jobNo+"   页号："+pageNo+"   单元号："+unitNo+"   是否为修改指令："+xiugai;
    }
    public void work(List<Page> inter) { //指令执行
        //遍历链表 页是否已经在主存
        for(int i=0;i<inter.size();i++) {
            int tempNo=inter.get(i).getPageNo();
            //所用到的页在主存
            if(tempNo==pageNo) {
                //绝对地址：块号*128+单元号
                char cno=inter.get(i).getBlockNo();
                int no=Character.getNumericValue(cno);
                int add=no*128+unitNo;
                System.out.println("    第"+jobNo+"条指令执行——绝对地址:"+add);

                if(xiugai==1)
                    inter.get(i).setModify(1);//设置修改位为1
                isInter=true;
                return;
            }
        }
        System.out.println("    第"+jobNo+"条指令执行——页错误*"+pageNo+"---》接下来执行FIFO");
        return;
    }

    //第一题核心，模拟硬件的地址转换和产生页中断，传来的参数为页表的列表
    public void translate(Page pages[]){
        Page p = null;
        for(Page page:pages){//遍历找到页表
            if(page.getPageNo()==pageNo){
                p=page;
                break;
            }
        }
        if(p.flag==1){//页表在主存中
            String str1 = Integer.toBinaryString(pageNo);
            while (str1.length()<4) {
                str1 = "0"+str1;
            }
            String str2 = Integer.toBinaryString(unitNo);
            while (str2.length()<8) {
                str2 = "0"+str2;
            }
            String realaddress = str1+str2;

            System.out.println("绝对地址为："+realaddress+"十进制为："+Integer.parseUnsignedInt(realaddress,2));

        }else{//页表不在主存中，发生缺页中断
            System.out.println("*"+p.pageNo);
        }
    }

}